﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2012-04-05
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


class IFSpriteObject;


//----------------------------------------------------------------
// 冷却效果精灵 Cooling（CoolDown）
//----------------------------------------------------------------
class IFSpriteCooling : public IFMemObject
{
public:
    // 显示到指定位置，左上角对齐
    virtual void Render(float x, float y) = 0;
    // 设置当前进度，并自动刷新精灵
    // .t 当前进度，范围[0.0f - 1.0f]闭区间
    virtual void SetProgress(float t) = 0;
    // 获取当前进度
    virtual float GetProgress() = 0;
    // 获取CD所使用的精灵
    virtual IFSpriteObject* GetSprite() = 0;
    // 设置是否打开模式
    // .open 是否打开模式
    // .deasil 是否顺时针模大
    virtual void SetMode(bool open, bool deasil) = 0;
    // 是否打开模式
    virtual bool IsOpen() = 0;
    // 是否顺时针模式
    virtual bool IsDeasil() = 0;
};


//----------------------------------------------------------------
// 扭曲效果精灵（来源HGE）
//----------------------------------------------------------------
class IFSpriteDistortion : public IFMemObject
{
public:
    enum EF_REF
    {
        NODE,
        TOPLEFT,
        CENTER,
    };

    // 显示到指定位置
    virtual void Render(float x, float y) = 0;
    // 清空数据状态
    virtual void Clear(DWORD col=0xFFFFFFFF, float z=0.5f) = 0;
    // 设置精灵源区域
    virtual void SetTextureRect(float x, float y, float w, float h) = 0;
    // 设置颜色
    virtual void SetColor(int col, int row, DWORD color) = 0;
    // 设置位移
    virtual void SetDisplacement(int col, int row, float dx, float dy, IFSpriteDistortion::EF_REF ref) = 0;
    // 获取精灵源区域
    virtual void GetTextureRect(float *x, float *y, float *w, float *h) = 0;
    // 获取颜色
    virtual DWORD GetColor(int col, int row) = 0;
    // 获取位移
    virtual void GetDisplacement(int col, int row, float *dx, float *dy, IFSpriteDistortion::EF_REF ref) = 0;
    // 获取行数
    virtual int GetRows() = 0;
    // 获取列数
    virtual int GetCols() = 0;
};


//----------------------------------------------------------------
// 粒子发射器对象
//----------------------------------------------------------------
class IFSpriteParticle : public IFMemObject
{
public:
    // 渲染粒子特效
    virtual void Render() = 0;
    // 在指定位置释放粒子特效
    virtual void FireAt(float x, float y) = 0;
    // 重新释放粒子特效
    virtual void Fire() = 0;
    // 停止发射
    virtual void Stop(bool bKillParticles=false) = 0;
    // 以动画形式移动当前发射点到指定位置
    virtual void MoveTo(float x, float y, bool bMoveParticles=false) = 0;
    virtual void Transpose(float x, float y) = 0;
    // 设置发射器缩放
    virtual void SetScale(float scale) = 0;
    // 取得当前发射器活动的粒子数量
    virtual int GetParticlesAlive() = 0;
    // 取得当前发射器生存了多长时间
    virtual float GetAge() = 0;
    virtual void GetPosition(float* x, float* y) = 0;
    virtual void GetTransposition(float* x, float* y) = 0;
    // 获取发射器缩放
    virtual float GetScale() = 0;
};


//----------------------------------------------------------------
// 路径粒子特效播放器
//----------------------------------------------------------------
class IFSpriteTrack : public IFMemObject
{
public:
    // 渲染特效
    virtual void Render() = 0;
    // 在指定路径上播放
    // .path 路径点（屏幕像素位置）
    // .speed 速度，单位：像素/秒
    virtual void Play(FV_VECTOR2& path, float speed) = 0;
    // 在指定路径上播放
    // .path 路径点数组
    // .pt_count 数组成员个数
    // .speed 速度，单位：像素/秒
    virtual void Play(FVECTOR2* path, size_t pt_count, float speed) = 0;
};


//----------------------------------------------------------------
// 2D骨骼动画
//----------------------------------------------------------------
class IFSpriteAnimate : public IFMemObject
{
public:
    // 播放全部
    virtual void Play(EF_ANIMATE_MODE mode) = 0;
    // 播放指定区间
    virtual void Play(EF_ANIMATE_MODE mode, WORD frame_start, WORD frame_end) = 0;
    // 播放指定的名字的动画
    // .action_name 允许输出无效名字或者为空
    // .fail_play_all 当没有找到动作名或者该动作有问题的时候，是否播放所有
    virtual bool Play(EF_ANIMATE_MODE mode, const WCHAR* action_name, bool fail_play_all) = 0;
    virtual bool Play(EF_ANIMATE_MODE mode, const ACHAR* action_name, bool fail_play_all) = 0;
    // 渲染
    virtual void Render(float x, float y) = 0;
    // 取得当前帧ID
    virtual DWORD GetFrameID() = 0;
    // 获取总帧数
    virtual DWORD GetFrameCount() = 0;
    // 获取动作数
    virtual size_t GetActionCount() = 0;
    // 获取动作表中指定动作的名字
    virtual const ACHAR* GetActionName(size_t idx) = 0;
    // 获取动作表中指定动作的开始帧编号
    virtual DWORD GetActionFrameStart(size_t idx) = 0;
    // 获取动作表中指定动作的结束帧编号
    virtual DWORD GetActionFrameEnd(size_t idx) = 0;
};